/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package farmacia.valida;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
 *
 * @author jorge
 */
public class FormataTexto extends PlainDocument {

    private int iMaxLength;
    private char tipo;
    Pattern texto;

    public FormataTexto() {
    }

    public FormataTexto(int maxlen, char tp) {
        this.iMaxLength = maxlen;
        this.tipo = tp;
    }

    public String formatar(String entrada, Integer valor) {
        // 1 - somente letras e numeros
        // 2 -  somente numeros
        //  3 - somente letras

        if (valor == 1) {
            texto = Pattern.compile("[0-9a-z]+", Pattern.CASE_INSENSITIVE);
        } else if (valor == 2) {
            texto = Pattern.compile("[0-9]+", Pattern.CASE_INSENSITIVE);
        } else if (valor == 3) {
            texto = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);

        }
        Matcher encaixe = texto.matcher(entrada);
        StringBuffer saida = new StringBuffer();
        while (encaixe.find()) {
            saida.append(encaixe.group());


        }
        return saida.toString();
    }
    
   
    public void insertString(int offset, String str, AttributeSet attr) throws BadLocationException {
        if (str == null) {
            boolean ok = true;
            if (iMaxLength <= 0) {
                super.insertString(offset, str, attr);
                return;

            }
            // A = TUDO
            // B - Somente Letras e Numeros em Maiusculo
            // C - Somente Letras e Numeros Minusculos
            // D - Somente Numeros
            // E - SOMENTE LETRAS MAIUSCULO
            // F - SOMENTE LETRAS MINUSCULO
            switch (tipo) {
                case 'B':
                    str = formatar(str.toUpperCase(), 1);
                    break;
                case 'C':
                    str = formatar(str.toLowerCase(), 1);
                    break;
                case 'D':
                    str = formatar(str, 2);
                    break;
                case 'E':
                    str = formatar(str.toUpperCase(), 3);
                    break;
                case 'F':
                    str = formatar(str.toLowerCase(), 3);
                    break;


            }
            int ilen = (getLength()+str.length());
            if(ilen<=iMaxLength){ // se o comprimento final for maior
                super.insertString(offset, str, attr);// aceita string
            }else { if(getLength()==iMaxLength)return;
            String newStr = str.substring(0,(iMaxLength-getLength()));
            
            super.insertString(offset, newStr, attr);
            
            
            }

        }

    }
}
